gtk-demo: Use editable labels in the settings demo
authorMatthias Clasen <mclasen@redhat.com>
Fri, 12 Jun 2020 15:07:37 +0000 (11:07 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 15 Jun 2020 16:08:54 +0000 (12:08 -0400)
This is more in line with the expected behavior for
editable lists.

demos/gtk-demo/listview_settings.c
demos/gtk-demo/listview_settings.ui

index e5908047b3bdb65f247b00503752ef44441bb4ea..3c0de54d9fc5866b77fefae011f7e6ec467eb639 100644 (file)
@@ -143,8 +143,9 @@ settings_key_new (GSettings          *settings,
 }
 
 static void
-item_value_changed (GtkListItem *item,
-                    GtkEntry    *entry)
+item_value_changed (GtkEditableLabel *label,
+                    GParamSpec       *pspec,
+                    GtkListItem      *item)
 {
   SettingsKey *self;
   const char *text;
@@ -152,8 +153,9 @@ item_value_changed (GtkListItem *item,
   GVariant *variant;
   GError *error = NULL;
   const char *name;
+  char *value;
 
-  text = gtk_editable_get_text (GTK_EDITABLE (entry));
+  text = gtk_editable_get_text (GTK_EDITABLE (label));
 
   g_object_get (item, "item", &self, NULL);
   g_object_unref (self);
@@ -166,17 +168,25 @@ item_value_changed (GtkListItem *item,
     {
       g_warning ("%s", error->message);
       g_clear_error (&error);
-      return;
+      goto revert;
     }
 
   if (!g_settings_schema_key_range_check (self->key, variant))
     {
       g_warning ("Not a valid value for %s", name);
-      return;
+      goto revert;
     }
 
   g_settings_set_value (self->settings, name, variant);
   g_variant_unref (variant);
+  return;
+
+revert:
+  gtk_widget_error_bell (GTK_WIDGET (label));
+
+  g_object_get (self, "value", &value, NULL);
+  gtk_editable_set_text (GTK_EDITABLE (label), value);
+  g_free (value);
 }
 
 static int
index cf2651d50b9e23afed01a8bdacbeac88545bfde0..8bf7e2582d8f75c8cf436b5b71215a38451cd95b 100644 (file)
 <interface>
   <template class="GtkListItem">
     <property name="child">
-      <object class="GtkEntry">
-        <signal name="activate" handler="item_value_changed" object="GtkListItem" swapped="yes"/>
-        <property name="xalign">0</property>
-        <binding name="text">
+      <object class="GtkEditableLabel">
+        <binding name="label">
           <lookup name="value" type="SettingsKey">
             <lookup name="item">GtkListItem</lookup>
           </lookup>
         </binding>
+        <signal name="notify::label" handler="item_value_changed"/>
       </object>
     </property>
   </template>